package info.liuxing.config;

import info.liuxing.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;


// 配置类 == 配置文件xml，该注解用于声明这是一个配置类
@Configuration
@ComponentScan(value = "info.liuxing",
        includeFilters = {
                // 配置只包含controller
                @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
                // 自定义规则
                @ComponentScan.Filter(type = FilterType.CUSTOM, classes = {CustomTypeFilter.class})
        },
        useDefaultFilters = false
)

// Jdk8 可以支持重复的注解@ComponentScan 来支持多个扫描定义
// 非Jdk8 可以指定@ComponentScans 来支持多个扫描定义

// @ComponentScan value:指定要扫描的包
// includeFilters = Filter[] : 指定扫描的时候只需要包含哪些组件
// excludeFilters = Filter[] : 指定扫描的时候按照什么规则排除哪些组件
// FilterType.ANNOTATION : 按照注解
// FilterType.ASSIGNABLE_TYPE : 按照给定的类型(类)
// FilterType.ASPECTJ : 使用ASPECTJ表达式(不常用)
// FilterType.REGEX : 按照正则表达式
// FilterType.CUSTOM : 按照自定义规则(参考注释，实现TypeFilter接口)
public class MainConfig {

    // 默认使用方法名作为id，也可以在Bean注解中指定
    @Bean(name = "person")
    public Person person() {
        return new Person("李四", 1);
    }

}
